#pragma once

#if !defined(NOMINMAX) && defined(_MSC_VER)
#	define NOMINMAX // required to stop windows.h messing up std::min
#endif

#undef min
#undef max

#include "glare.core.Config.h"

#ifndef GLARE_PLATFORM
#	error "Glare3D Platform was not specified"
#endif

#include <assert.h>
#include <cstdlib>
#include <limits>
#include <list>
#include <ostream>
#include <vector>
#include <math.h>

#if GLARE_COMPILER & GLARE_COMPILER_MSVC
#	pragma warning (disable : 4127) // conditional expression is constant
#	pragma warning (disable : 4996) // ignore deprecated status
#	pragma warning (disable : 4100) // ignore unreferenced formal parameters
#	include "windows.h"
#endif

#define GLARE_REAL_TYPE_FLOAT 1
#define GLARE_REAL_TYPE_DOUBLE 2

#define GLARE_REAL_TYPE GLARE_REAL_TYPE_FLOAT

#if GLARE_REAL_TYPE == GLARE_REAL_TYPE_FLOAT
#	define GLARE_REAL_VALUE(value) (float)value
#else
#	define GLARE_REAL_VALUE(value) value
#endif

namespace Glare {

#if GLARE_REAL_TYPE == GLARE_REAL_TYPE_FLOAT
	typedef float Real;
#elif GLARE_REAL_TYPE == GLARE_REAL_TYPE_DOUBLE
	typedef double Real;
#else
#	error "Undefined type for Math::Real"
#endif

	class AxisAlignedBox;
	class Degree;
	class Radian;

	class Matrix3;
	class Matrix4;
	class Plane;
	class PlaneBoundedVolume;
	class Ray;
	class Sphere;
	class Vector2;
	class Vector3;
}
